home *** CD-ROM | disk | FTP | other *** search
/ The Best of MacTutor - S…e Code for Volumes 1 to 5 / The Best of MacTutor - Source Code for Volume 1-5 (Wayzata Technology)(6031)(1990).bin / Source Code / #03 (Aug85-Sep85) / asm / asm Sound Vol. 1 #9 / SoundOff < prev   
Text File  |  1985-06-18  |  7KB  |  279 lines

  1. *ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  2. *ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ Sound Exercize #1 ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  3. *ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ (C) 1985 by Chris Yerga for MacTutor ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  4. *ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  5.  
  6.  
  7. INCLUDE     MacTraps.D
  8.  
  9. ;  Declare external labels
  10.  
  11. XDEF    START
  12.  
  13.  
  14. ;ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ Define Macros ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  15.  
  16. MACRO     Center    String,MidPT,Y    =
  17.  
  18.     CLR.W    -(SP)        ;Save room for INTEGER width of string
  19.     PEA    '{String}'
  20.     _StringWidth
  21.     CLR.L    D3        ;Clear the high word of D3 so the DIVU works
  22.     MOVE.W    (SP)+,D3    ;Get the width (in pixels) in D3
  23.     DIVU    #2,D3        ;Divide by 2
  24.     MOVE.L    #{MidPT},D4
  25.     SUB.W    D3,D4        ;Subtract (Width/2) from 103 to center text
  26.     MOVE.W    D4,-(SP)    ;Push the X coordinate
  27.     MOVE.W    #{Y},-(SP)    ;Push the Y coordinate
  28.     _MoveTo            ;Position the pen
  29.     
  30.     PEA    '{String}'
  31.     _DrawString
  32.     |            ;End of Macro
  33.     
  34. ;ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ Local Constants ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  35.  
  36. AllEvents    EQU    $0000FFFF    ; Mask for FlushEvents
  37. MaxEvents    EQU    12
  38. DWindLen    EQU    $AA        ; The size of a Dialog Record
  39.  
  40. ;ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ Start of Main Program ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  41.  
  42. BadPtr:    _Debugger            ;Should never get here.  Is called
  43.                     ;when there is a problem with the
  44.                     ;memory manager.
  45.  
  46. START:    MOVEM.L    D0-D7/A0-A6,-(SP)    ;The standard-issue routine which
  47.     LEA    SAVEREGS,A0        ;which saves the registers etc.
  48.     MOVE.L    A6,(A0)    
  49.     MOVE.L    A7,4(A0)
  50.     
  51. ;ŸŸŸŸŸŸŸŸŸŸŸŸŸ Initialize the ROM routines ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  52.  
  53.     PEA    -4(A5)        ;QD Global ptr
  54.     _InitGraf        ;Init QD global
  55.     
  56.     _InitFonts        ;Init font manager
  57.     _InitWindows        ;Init Window Manager
  58.     _InitMenus        ;Guess what...you got it!
  59.     
  60.     CLR.L    -(SP)        ;Standard SysErr/DS dialog
  61.     _InitDialogs        ;Init Dialog Manger
  62.     
  63.     _TEInit            ;Init ROM Text edit
  64.     
  65.     MOVE.L    #AllEvents,D0    ;And flush ALL previous
  66.     _FlushEvents        ;events
  67.     
  68.     _InitCursor        ;Get the standard arrow
  69.     
  70.     
  71. ;◊◊◊ Allocate the memory that we need ◊◊◊
  72.  
  73.     MOVE.L    #50,D0        ;Get a 50 Byte nonrelocatable block
  74.     _NewPtr
  75.     CMP    #0,D0        ;Did we get the block??
  76.     BNE    BadPtr        ;Nope...jump to MacsBug
  77.     LEA    ParamBlock,A1    ;Save the Ptr
  78.     MOVE.L    A0,(A1)        
  79.     
  80.     MOVE.L    #255,D0        ;Get a 255 byte block for waveform def
  81.     _NewPtr,CLEAR        ;and fill it with zeros while you're at it
  82.     CMP    #0,D0        ;Did we get the memory?
  83.     BNE    BadPtr        ;Nope...Debugger time
  84.     LEA    Wave,A1        ;Save the Ptr
  85.     MOVE.L    A0,(A1)        
  86.     
  87. ;◊◊◊ Set up the ioParamBlock fields ◊◊◊
  88.     
  89.     MOVE.L    ParamBlock,A0    ;Get the Ptr to ioParamBlock
  90.     CLR.L    12(A0)        ;No completion routine
  91.     MOVE.W    #-4,24(A0)    ;The Sound Driver reference #
  92.     CLR.W    44(A0)        ;Standard positioning
  93.     CLR.L    46(A0)        ;No offset for the write
  94.     
  95. ;◊◊◊ Fill the Wave buffer with a simple Square Wave definition ◊◊◊
  96.  
  97.     MOVE.L    Wave,A0        ;Get the base address of the block
  98.     MOVE.L    #127,D0        ;Set up the wave definition
  99. MakeWave:
  100.     MOVE.B    #255,(A0)+    ;Set bytes 0-127 of the wave definition
  101.                 ;and increment A0
  102.     DBRA    D0,MakeWave    ;loop until 127...
  103.     
  104.     
  105. ;ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ Set up the Dialog Box ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  106.  
  107.     CLR.L    -(SP)        ;Save room for DIalogPtr
  108.     MOVE.W    #128,-(SP)    ;The ResID of the dialog
  109.     PEA    DStorage(A5)    ;Where to put the DialogRec
  110.     MOVE.L    #-1,-(SP)    ;Put it in front, please...
  111.     _GetNewDialog
  112.     LEA    DHandle,A2    ;Save handle, but keep it
  113.     MOVE.L    (SP),(A2)    ;on the stack
  114.     _DrawDialog        ;Draw the dialog..
  115.     
  116.     LEA    DHandle,A2
  117.     MOVE.L    (A2),-(SP)    ;Set the Dialog to the current GrafPort
  118.     _SetPort
  119.     
  120.     MOVE.W    #7,-(SP)    ;Select Athens
  121.     _TextFont
  122.     MOVE.W    #18,-(SP)    ;in 18Pt size
  123.     _TextSize
  124.     
  125.     Center    Sound Example #1,206,35    ;<- God this makes life easy!
  126.     
  127.     MOVE.W    #1,-(SP)    ;Select Chicago
  128.     _TextFont
  129.     MOVE.W    #12,-(SP)    ;in 12Pt size
  130.     _TextSize
  131.     
  132.     Center    ©1985 Chris Yerga for MacTutor,206,52
  133.  
  134.  
  135. ;ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ Main Event Loop ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  136.  
  137. MAIN:
  138.     CLR.L    -(SP)        ;NIL for FilterProc
  139.     PEA    ItemHit        ;VAR ItemHit
  140.     _ModalDialog        ;handle the dialog for us!
  141.     MOVE    ItemHit,D0    ;Get the result
  142.     
  143.     CMP    #1,D0        ;Is it Square Wave?
  144.     BEQ    Square        ;Yes....
  145.     
  146.     CMP    #2,D0        ;Is it 4Tone?
  147.     BEQ    FourTone    ;You got it....
  148.     
  149.     CMP    #3,D0        ;Is it Bye Bye??
  150.     BEQ     Adios        ;Uh huh...
  151.     
  152.     BRA    Main        ;Keep going till we get a valid event...
  153.     
  154. Square:
  155.     MOVE.L    ParamBlock,A0        ;Get the Ptr to ioParamBlock
  156.     MOVE.L    #SqEnd-SqBegin,36(A0)    ;The length of the data, so we
  157.                     ;can tell the device manager how
  158.                     ;much to write
  159.     LEA    SqBegin,A1        ;Ptr to our data buffer
  160.     MOVE.L    A1,32(A0)
  161.     _Write                ;this is the actual Write call.
  162.                     ;Be sure to have A0 pointing to
  163.                     ;your ioParamBlock!
  164.     BRA    Main            ;We're done for now....
  165.     
  166. SqBegin:
  167.     DC.W    -1        ;This tells the sound driver that
  168.                 ;the data is for the square-wave
  169.                 ;driver.
  170.                 
  171. ;Play the C major diatonic scale...
  172.  
  173.     DC.W    5937,128,20    ;C
  174.     DC.W    5278,128,20    ;D
  175.     DC.W    4750,128,20    ;E
  176.     DC.W    4453,128,20    ;F
  177.     DC.W    3958,128,20    ;G
  178.     DC.W    3562,128,20    ;A
  179.     DC.W    3167,128,20    ;B
  180.     DC.W    2969,128,20    ;C
  181.     DC.W    3167,128,20    ;B
  182.     DC.W    3562,128,20    ;A
  183.     DC.W    3958,128,20    ;G
  184.     DC.W    4453,128,20    ;F
  185.     DC.W    4750,128,20    ;E
  186.     DC.W    5278,128,20    ;D
  187.     DC.W    5937,128,20    ;C
  188.     DC.W    0,0,0
  189. SqEnd:    DC.W    0        ;End of the data
  190.     
  191. FourTone:
  192.     MOVE.L    ParamBlock,A0        ;Get the Ptr to our ioParamBlock
  193.     MOVE.L    #6,36(A0)        ;ioCount (how many bytes to write)
  194.                     ;in this case always 6 bytes
  195.     MOVE.L    Wave,A2            ;Get the Ptr to the waveshape def
  196.     LEA    FTSynthRec,A1        ;Get the Ptr to the sound table
  197.     MOVE.L    #3,D0            ;Loop 4 times
  198. SetWave:
  199.     MOVE.W    #30,(A1)        ;Set the tone length to .5 seconds
  200.     ADDA    #34,A1            ;Adjust A1 to point to WavePtr fields
  201.     MOVE.L    A2,(A1)+        ;Set 1st WavePtr
  202.     MOVE.L    A2,(A1)+        ;Set 2nd WavePtr
  203.     MOVE.L    A2,(A1)+        ;Set 3rd WavePtr
  204.     MOVE.L    A2,(A1)+        ;Set 4th WavePtr
  205.     DBRA    D0,SetWave
  206.     
  207.     LEA    FTBegin,A3        ;Set the BuffPtr in the ParamBlock
  208.     MOVE.L    A3,32(A0)        ;to point to our data buffer
  209.     LEA    FTSynthRec,A2        ;Set the FTSRecPtr in the Data
  210.     MOVE.L    #3,D3            ;Loop 4 times
  211. FTLoop:
  212.     MOVE.L    A2,2(A3)        ;Set the pointer to point to the
  213.                     ;next sound
  214.     MOVE.L    ParamBlock,A0        ;Get Ptr to ioParamBlock in A0
  215.     _Write                ;Write it!
  216.     ADDA    #50,A2            ;Point to the next tone record
  217.     DBRA    D3,FTLoop        ;and loop...
  218.     
  219.     BRA    Main            ;Thank you...
  220.     
  221. ;The four-tone record is unique in that it is not actually written to
  222. ;the sound driver.  Rather,  only a ptr to the actual tones is written.
  223. ;This means that only one set of 4 tones can be written at a time.
  224.  
  225. FTBegin:
  226.     DC.W    1            ;Four tone = 1
  227.     DC.L    0            ;Holder for Ptr to the actual tones
  228.     
  229. FTSynthRec:
  230.     DC.W    60            ;Do sound for 1 sec
  231.     DC.L    $3CBB0,0        
  232.     DC.L    $5B188,0        
  233.     DC.L    $4DBC3,0    
  234.     DC.L    $00000,0
  235.     DC.L    0,0,0,0            ;Place holders for WavePtr's
  236.     
  237.     DC.W    60            ;Do sound for 1 sec
  238.     DC.L    $36A85,0
  239.     DC.L    $50F95,0
  240.     DC.L    $6D50A,0
  241.     DC.L    $00000,0
  242.     DC.L    0,0,0,0            ;Place holders for WavePtr's
  243.     
  244.     DC.W    75            ;.5 SEC
  245.     DC.L    $287CA,0
  246.     DC.L    $3CBB0,0
  247.     DC.L    $30959,0
  248.     DC.L    $00000,0
  249.     DC.L    0,0,0,0
  250.     
  251.     DC.W    30
  252.     DC.L    $1E5D8,0
  253.     DC.L    $287CA,0
  254.     DC.L    $30959,0
  255.     DC.L    $00000,0
  256.     DC.L    0,0,0,0
  257.     
  258.     
  259. ADIOS:
  260.     LEA    SaveRegs,A0
  261.     MOVE.L    (A0),A6
  262.     MOVE.L    4(A0),A7
  263.     MOVEM.L    (SP)+,D0-D7/A0-A6
  264.     RTS
  265.  
  266. ;ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ Program Variables ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  267.  
  268. SaveRegs:    DCB.L    2,0    ;For saving the SP etc..
  269.  
  270. DHandle:    DC.L    0    ;For the dialog Handle
  271. ItemHit:    DC.W    0    ;For _ModalDialog
  272. ParamBlock:    DC.L    0    ;For the ioPB
  273. Wave:        DC.L    0    ;For the WaveShape definition
  274.  
  275. ;ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ Dialog Record ŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸŸ
  276.  
  277. DStorage:    DS.W    DWindLen
  278.  
  279.